package com.lottemall.item.service;

import com.lottemall.common.enums.ExceptionEnume;
import com.lottemall.common.exception.LtException;
import com.lottemall.item.mapper.SpecGroupMapper;
import com.lottemall.item.mapper.SpecParamMapper;
import com.lottemall.item.pojo.SpecGroup;
import com.lottemall.item.pojo.SpecParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 统一的处理规格参数的业务类
 */
@Service
public class SpecificationService {
    @Autowired
    private SpecGroupMapper specGroupMapper;

    @Autowired
    private SpecParamMapper specParamMapper;

    /**
     * 根据商品类型查询规格组
     *
     * @param cid 商品类型cid
     * @return
     */
    public List<SpecGroup> queryGroupByCid(Long cid) {
        SpecGroup specGroup = new SpecGroup();
        specGroup.setCid(cid);
        List<SpecGroup> groupList = specGroupMapper.select(specGroup);
        if (CollectionUtils.isEmpty(groupList)) {
            throw new LtException(ExceptionEnume.SPEC_GROUP_NOT_FOND);
        }
        return groupList;
    }


    /**
     * 查询商品规格参数
     *
     * @param gid       可能根据规格组gid
     * @param cid       可能根商品类型cid
     * @param searching 可能根据是否搜索
     * @return
     */
    public List<SpecParam> queryParamList(Long gid, Long cid, Boolean searching) {
        SpecParam specParam = new SpecParam();
        specParam.setGroupId(gid);
        specParam.setCid(cid);
        specParam.setSearching(searching);
        List<SpecParam> groupList = specParamMapper.select(specParam);
        if (CollectionUtils.isEmpty(groupList)) {
            throw new LtException(ExceptionEnume.SPEC_PARAM_NOT_FOND);
        }
        return groupList;
    }

    /**
     * 根据商品分类id查询规格组以及组内参数
     *
     * @param cid
     * @return
     */
    public List<SpecGroup> queryListByCid(Long cid) {
        //查询规格组
        List<SpecGroup> specGroups = queryGroupByCid(cid);
        //查询当前分类下的参数
        List<SpecParam> specParams = queryParamList(null, cid, null);
        //想把规格参数变成map,map的key是 规格组id，map的值是组下的所有参数
        Map<Long, List<SpecParam>> prarmsMap = new HashMap<>();
        for (SpecParam param : specParams) {
            if (!prarmsMap.containsKey(param.getId())) {
                //如果这个组id在map中不存在，新增一个list
                prarmsMap.put(param.getId(), new ArrayList<>());
            }
            //然后不论怎样我们都要吧参数 存入 到map中
            prarmsMap.get(param.getGroupId()).add(param);//这里先通过组id得到map引用然后 在添加SpecParam（并且一个组下有多个参数组）
        }
        //填充param到group
        for (SpecGroup specGroup : specGroups) {
            specGroup.setParams(prarmsMap.get(specGroup.getId()));
        }
        return specGroups;
    }
}
